package com.itguigu.volatiledemo;

/*
 * 一、volatile 关键字：当多个线程进行操作共享数据时，可以保证内存中的数据可见。
 * 					  相较于 synchronized 是一种较为轻量级的同步策略。
 *
 * 注意：
 * 1. volatile 不具备“互斥性”
 * 2. volatile 不能保证变量的“原子性”
 */
public class TestVolatile {
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();
        while (true){
            if (td.isFlag()){//如果没有volatile，也可以把if代码块放到synchronized代码块内，会让主线程重新刷新自己的缓存
                System.out.println("===============");
                break;
            }
        }
    }
}

class ThreadDemo implements Runnable{
    private volatile  boolean flag = false;


    public void run() {
        try {
            Thread.sleep(200);
        }catch (Exception e){

        }
        flag = true;//前提flag 为volatile,因为主线程读取的是自己的线程内部的缓存数据，加上volatile关键字
                    //当主线程在循环读的时候，就可以知道自己线程内部的缓存已经失效，需要重新读取主存内的值
        System.out.println("flag ="+isFlag());

    }
    public boolean isFlag(){
        return flag;
    }
    public void setFlag(boolean flag){
        this.flag = flag;
    }
}

